#pragma once
#include "Properties.h"
#include "util/Locale.h"
#include "util/MessageFormat.hpp"
#include "yzrutil.h"
#include "lang/String.h"
#include <unordered_map>
namespace yzrilyzr_util{
	EBCLASS(Lang){
	private:
	std::unordered_map<yzrilyzr_lang::String, std::shared_ptr<Properties>> map;
	yzrilyzr_lang::String currentLocale;
	public:
	Lang();
	~Lang()=default;
	void add(std::shared_ptr<Locale> locale, std::shared_ptr<Properties> props);
	void add(std::shared_ptr<Properties> props);
	std::vector<yzrilyzr_lang::String > availableLanguages();
	void setCurrentLocale(const yzrilyzr_lang::String & current);
	yzrilyzr_lang::String  getCurrentLocale()const;
	yzrilyzr_lang::String  get(const yzrilyzr_lang::String & key)const;
	std::unordered_map<yzrilyzr_lang::String, std::shared_ptr<Properties>> & getMap();

	template<typename... Args>
	yzrilyzr_lang::String getf(const yzrilyzr_lang::String & key, Args&&... args)const{
		return MessageFormat::format(get(key), std::forward<Args>(args)...);
	}
	const char * getc(const yzrilyzr_lang::String & key)const;
	const wchar_t * getcw(const yzrilyzr_lang::String & key)const;
	const char16_t * getc16(const yzrilyzr_lang::String & key)const;
	yzrilyzr_lang::String  get(std::shared_ptr<Locale> locale, const yzrilyzr_lang::String & key)const;
	};
}